import sqlalchemy

engine = sqlalchemy.create_engine('mysql://root:longbhu1214@123.56.253.79/testdb', echo=True)

meta_data = sqlalchemy.MetaData()

# 参数一：person 为表名字
"""
    参数一：person 为表名字
    参数二：MetaData 对象用于描述和管理数据库结构。 
    参数三：person 为表名字
"""
person = sqlalchemy.Table(
    "person", meta_data,
    sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True),
    sqlalchemy.Column("name", sqlalchemy.String(128), unique=True, nullable=False), # nullable=False 不可为空
    sqlalchemy.Column("time", sqlalchemy.Date, nullable=False)
)

# meta_data.create_all(engine) 的作用是根据 MetaData 对象中的表格定义，在指定的数据库引擎 (engine) 中创建相应的表格。
meta_data.create_all(engine)

person_insert = person.insert() # 返回的insert插入语句
print(person_insert) # INSERT INTO person (id, name, time) VALUES (:id, :name, :time)


# insert_tom 是带数据的insert插入语句
insert_tom = person_insert.values(name = "tom4", time = "2024-1-1")

with engine.connect() as conn:
    result = conn.execute(insert_tom)
    print(result.inserted_primary_key)
    conn.commit()
    """
    为什么创建连接要在with代码块中？
    答： 一旦 with 块结束，Python 会自动调用 conn.close() 来释放连接资源，
        确保连接的正确关闭和释放，避免了手动管理连接的复杂性和可能的资源泄漏问题。
    
    sqlalchemy 默认开启事务模式，需要commit提交
        conn.commit()
        
    不提交的结果：
        2024-07-27 22:57:34,214 INFO sqlalchemy.engine.Engine INSERT INTO person (name, time) VALUES (%s, %s)
        2024-07-27 22:57:34,214 INFO sqlalchemy.engine.Engine [generated in 0.00025s] ('tom', '2024-1-1')
        2024-07-27 22:57:34,225 INFO sqlalchemy.engine.Engine ROLLBACK
        
    提交后的结果：
        2024-07-27 22:59:33,083 INFO sqlalchemy.engine.Engine INSERT INTO person (name, time) VALUES (%s, %s)
        2024-07-27 22:59:33,085 INFO sqlalchemy.engine.Engine [generated in 0.00024s] ('tom', '2024-1-1')
        2024-07-27 22:59:33,094 INFO sqlalchemy.engine.Engine COMMIT       
    """
